package com.ugc.harmony.clientai.lang.request

/**
 * 性能参数数据类
 * 用于存储模型推理过程中的各项性能指标（时间单位为毫秒）
 */
data class PerfParams(
    val loadMs: Float = 0F, // 模型加载耗时
    val prefillMs: Float = 0F, // 预填充阶段耗时
    val prefillTokens: Float = 0F, // 预填充处理的token数量
    val prefillSampleMs: Float = 0F, // 预填充采样时间
    val decodingMs: Float = 0F, // 解码阶段耗时
    val decodingTokens: Int = 0, // 解码处理的token数量
    val decodingSampleMs: Float = 0F, // 解码采样时间
    val sampleMs: Float = 0F, // 总采样时间
    val sampleTokens: Int = 0, // 总采样token数量
    val totalMs: Float = 0F, // 总耗时
    var dtMap: Map<String, String> = emptyMap() // 原始数据映射
) {
    companion object {
        /**
         * 从Map创建PerfParams对象
         * @param map 包含性能数据的映射，键名与类属性对应
         * @return 解析后的PerfParams实例，无法解析的值使用默认值
         */
        fun fromMap(map: Map<String, String>): PerfParams {
            return PerfParams(
                loadMs = map["load_ms"]?.toFloatOrNull() ?: 0F,//model load time
                prefillMs = map["prefill_ms"]?.toFloatOrNull() ?: 0F, //
                prefillTokens = map["prefill_tokens"]?.toFloatOrNull() ?: 0F,
                prefillSampleMs = map["prefill_sample_ms"]?.toFloatOrNull() ?: 0F, //0
                decodingMs = map["decoding_ms"]?.toFloatOrNull() ?: 0F, // decode total time
                decodingTokens = map["decoding_tokens"]?.toIntOrNull() ?: 0,
                decodingSampleMs = map["decoding_sample_ms"]?.toFloatOrNull() ?: 0F, //0
                sampleMs = map["sample_ms"]?.toFloatOrNull() ?: 0F, //
                sampleTokens = map["sample_tokens"]?.toIntOrNull() ?: 0,
                totalMs = map["total_ms"]?.toFloatOrNull() ?: 0F, // total time above
            ).apply { this.dtMap = map }
        }

        /**
         * 辅助函数：将 "key1:value1;key2:value2;" 格式的字符串解析为 PerfParams
         * @param perfString 性能数据字符串
         * @return  PerfParams
         */
        fun fromPerfString(perfString: String): PerfParams {
            val map = mutableMapOf<String, String>()
            // 按分号 ';' 分割键值对
            val pairs = perfString.split(';').filter { it.isNotBlank() }

            for (pair in pairs) {
                // 按冒号 ':' 分割键和值
                val keyValue = pair.split(':', limit = 2)
                if (keyValue.size == 2) {
                    val key = keyValue[0].trim()
                    val value = keyValue[1].trim()
                    map[key] = value
                } else {
                    // 可选：记录格式不正确的 pair
                    println("警告: 忽略格式不正确的数据项 '$pair'")
                }
            }
            return PerfParams.fromMap(map)
        }
    }

    /**
     * 将对象转换回Map形式
     * @return 包含所有性能数据的Map
     */
    fun toMap(): Map<String, String> {
        return mapOf(
            "load_ms" to loadMs.toString(),
            "prefill_ms" to prefillMs.toString(),
            "prefill_tokens" to prefillTokens.toString(),
            "prefill_sample_ms" to prefillSampleMs.toString(),
            "decoding_ms" to decodingMs.toString(),
            "decoding_tokens" to decodingTokens.toString(),
            "decoding_sample_ms" to decodingSampleMs.toString(),
            "sample_ms" to sampleMs.toString(),
            "sample_tokens" to sampleTokens.toString(),
            "total_ms" to totalMs.toString()
        )
    }

    /**
     * 辅助函数：格式化打印 PerfParams 对象的内容
     * @param params 要打印的 PerfParams 对象
     */
    fun printParams() {
        println("\n=== 性能数据详情 ===")
        println("模型加载耗时: $loadMs ms")
        println("预填充阶段耗时: $prefillMs ms")
        println("预填充处理Token数量: $prefillTokens")
        println("预填充采样时间: $prefillSampleMs ms")
        println("解码阶段耗时: $decodingMs ms")
        println("解码处理Token数量: $decodingTokens")
        println("解码采样时间: $decodingSampleMs ms")
        println("总采样时间: $sampleMs ms")
        println("总采样Token数量: $sampleTokens")
        println("总耗时: $totalMs ms")
        println("====================\n")
    }


}